package cn.lianyutiantang.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.client.RestTemplate;

/**
 * Created by OPJJ-JSJ-0010 on 2018/8/14.
 */
public class RestTemplateUtil {
    private static final Logger LOGGER = LoggerFactory.getLogger(RestTemplateUtil.class);

    //private static CloudClientUtil cloudClientUtil;
    private static RestTemplate restTemplat;//http调用的对象


    public static RestTemplate getInstance() {
        try {
            if (null == restTemplat) {
                restTemplat = new RestTemplate();
            }
        } catch (Exception e) {
            // TODO: handle exception
        }
        return restTemplat;
    }

    /**
     * 微服务提交JSON请求
     *
     * @param url           请求地址
     * @param requestObject 请求对象
     * @param responseType  返回类型
     * @param <T>
     * @return
     */
    public static <T> T postCloudJson(String url, Object requestObject, Class<T> responseType) {
        try {
            LOGGER.info(url + "-in:" + JSON.toJSONString(requestObject, SerializerFeature.WriteMapNullValue, SerializerFeature.DisableCircularReferenceDetect, SerializerFeature.WriteDateUseDateFormat));
            long startTime = System.currentTimeMillis(); // 开始请求时间
            JSONObject jsonObject = getClient().postForObject(url, requestObject, JSONObject.class);
            long endTime = System.currentTimeMillis(); // 结束请求时间
            LOGGER.info(url + "-out,耗时(" + (endTime - startTime) + "):" + JSON.toJSONString(jsonObject));
            return (T) JSON.parseObject(jsonObject.toJSONString(), responseType);//发现阿里的fastjson是不区分大小写的，这样子写是为了避免物流改属性的大小写而使用 20180710 zhengjl
        } catch (Exception e) {
            e.printStackTrace();
            LOGGER.error(e.getMessage());
            return null;
        }

    }


    /**
     * http提交JSON请求
     *
     * @param url           请求地址
     * @param requestObject 请求对象
     * @param responseType  返回类型
     * @param <T>
     * @return
     */
    public static <T> T postJson(String url, Object requestObject, Class<T> responseType) {
        try {
            //RestTemplate restTemplat=new RestTemplate();
            LOGGER.info(url + "-in:" + JSON.toJSONString(requestObject, SerializerFeature.WriteMapNullValue, SerializerFeature.DisableCircularReferenceDetect, SerializerFeature.WriteDateUseDateFormat));
            long startTime = System.currentTimeMillis(); // 开始请求时间
            //JSONObject jsonObject = getInstance().postForObject(url, requestObject, JSONObject.class);
            JSONObject jsonObject = getClient().postForObject(url, requestObject, JSONObject.class);
            long endTime = System.currentTimeMillis(); // 结束请求时间
            LOGGER.info(url + "-out,耗时(" + (endTime - startTime) + "):" + JSON.toJSONString(jsonObject));
            return (T) JSON.parseObject(jsonObject.toJSONString(), responseType);//发现阿里的fastjson是不区分大小写的，这样子写是为了避免物流改属性的大小写而使用 20180710 zhengjl
        } catch (Exception e) {
            e.printStackTrace();
            LOGGER.error(e.getMessage());
            return null;
        }
    }

    /**
     * 微服务发送Get请求
     *
     * @param url          请求地址,地址或当参数也可以
     * @param responseType 返回类型
     * @param <T>
     * @return
     */
    public static <T> T getForObject(String url, Class<T> responseType) {
        try {
            return getClient().getForObject(url, responseType);
        } catch (Exception e) {
            LOGGER.error(e.getMessage());
            return null;
        }
    }

    /**
     * 获得一个RestTemplate客户端
     *
     * @return
     */
    public static RestTemplate getClient() {
        return CloudRestTemplateConfig.getClient();
    }
}
